package com.xxxx.crm.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xxxx.crm.base.BaseService;
import com.xxxx.crm.dao.CustomerMapper;
import com.xxxx.crm.dao.CustomerOrderMapper;
import com.xxxx.crm.query.CustomerOrderQuery;
import com.xxxx.crm.utils.AssertUtil;
import com.xxxx.crm.vo.CusDevPlan;
import com.xxxx.crm.vo.Customer;
import com.xxxx.crm.vo.CustomerOrder;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service
public class CustomerOrderService extends BaseService<CustomerOrder,Integer> {

    @Resource
    private CustomerOrderMapper customerOrderMapper;
    @Resource
    private CustomerMapper customerMapper;


    /**
     * 多条件分页查询客户 （返回的数据格式必须满足LayUi中数据表格要求的格式）
     * @param customerOrderQuery
     * @return java.util.Map<java.lang.String,java.lang.Object>
     */
    public Map<String, Object> queryCustomerOrderByParams(CustomerOrderQuery customerOrderQuery) {
        Map<String, Object> map = new HashMap<>();

        // 开启分页
        PageHelper.startPage(customerOrderQuery.getPage(), customerOrderQuery.getLimit());
        // 得到对应分页对象
        PageInfo<CustomerOrder> pageInfo = new PageInfo<>(customerOrderMapper.selectByParams(customerOrderQuery));

        // 设置map对象
        map.put("code",0);
        map.put("msg","success");
        map.put("count",pageInfo.getTotal());
        // 设置分页好的列表
        map.put("data",pageInfo.getList());

        return map;
    }


    /***
     * 添加订单信息数据
     *  1. 参数校验
     *      客户ID   非空，数据存在
     *      订单编号   非空
     *      收货地址     非空
     *  2. 设置参数的默认值
     *      是否有效    默认有效
     *      创建时间    系统当前时间
     *      修改时间    系统当前时间
     *  3. 执行添加操作，判断受影响的行数
     * @param customerOrder
     * @return void
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void addCustomerOrder(CustomerOrder customerOrder) {
        /* 1. 参数校验  */
        checkCustomerOrder(customerOrder);

        /* 2. 设置参数的默认值 */
        // 是否有效    默认有效
        customerOrder.setIsValid(1);
        // 是否支付    默认未支付
        customerOrder.setState(0);
        // 下单时间    系统当前时间
        customerOrder.setOrderDate(new Date());
        // 创建时间    系统当前时间
        customerOrder.setCreateDate(new Date());
        // 修改时间    系统当前时间
        customerOrder.setUpdateDate(new Date());

        /* 3. 执行添加操作，判断受影响的行数 */
        AssertUtil.isTrue(insertSelective(customerOrder) != 1, "订单信息添加失败！");
    }

    /**
     *  参数校验
     *      客户ID   非空，数据存在
     *      订单编号   非空
     *      收货地址     非空
     *
     * @param customerOrder
     * @return void
     */
    private void checkCustomerOrder(CustomerOrder customerOrder) {
        // 客户ID   非空，数据存在
        Integer cId = customerOrder.getCusId();
        AssertUtil.isTrue(null == cId || customerMapper.selectByPrimaryKey(cId) == null,"请设置客户ID！");
        // 订单编号   非空
        AssertUtil.isTrue(StringUtils.isBlank(customerOrder.getOrderNo()), "订单编号不能为空！");
        // 收货地址     非空
        AssertUtil.isTrue(StringUtils.isBlank(customerOrder.getAddress()), "收货地址不能为空！");
    }


    /**
     * 更新客户开发计划项数据
     *  1. 参数校验
     *      计划项ID     非空，数据存在
     *      营销机会ID   非空，数据存在
     *      计划项内容   非空
     *      计划时间     非空
     *  2. 设置参数的默认值
     *      修改时间    系统当前时间
     *  3. 执行更新操作，判断受影响的行数

     * @param customerOrder
     * @return void
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void updateCustomerOrder(CustomerOrder customerOrder){

        AssertUtil.isTrue(null == customerOrder.getId() || selectByPrimaryKey(customerOrder.getId()) == null, "待更新的记录不存在！");
        checkCustomerOrder(customerOrder);
        customerOrder.setUpdateDate(new Date());
        AssertUtil.isTrue(updateByPrimaryKeySelective(customerOrder) != 1, "订单信息更新失败！");

    }

    /***
     * 删除计划项
     *  1. 判断ID是否为空，且数据存在
     *  2. 修改isValid属性
     *  3. 执行更新操作
     * @param id
     * @return void
     */
    public void deleteCustomerOrder(Integer id) {
        // 1. 判断ID是否为空，且数据存在
        AssertUtil.isTrue(null == id, "待删除记录不存在！");
        // 通过ID查询计划项对象
        CustomerOrder customerOrder = customerOrderMapper.selectByPrimaryKey(id);
        // 设置记录无效（删除）
        customerOrder.setIsValid(0);
        customerOrder.setUpdateDate(new Date());
        // 执行更新操作
        AssertUtil.isTrue(customerOrderMapper.updateByPrimaryKeySelective(customerOrder) != 1, "计划项数据删除失败！");
    }

    /**
     * 支付操作
     * @param id
     * @return void
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void pay(Integer id) {
        // 判断ID是否为空
        AssertUtil.isTrue(null == id , "待支付订单不存在！");
        // 通过ID查询计划项对象
        CustomerOrder customerOrder = customerOrderMapper.selectByPrimaryKey(id);
        // 设置记录无效（删除）
        customerOrder.setState(1);
        customerOrder.setUpdateDate(new Date());
        // 执行更新操作
        AssertUtil.isTrue(customerOrderMapper.updateByPrimaryKeySelective(customerOrder) != 1, "计划项数据删除失败！");
    }


    /***
     * 通过订单ID查询对应的订单记录
     * @param orderId
     * @return java.util.Map<java.lang.String,java.lang.Object>
     */
    public Map<String, Object> queryOrderById(Integer orderId) {
        return customerOrderMapper.queryOrderById(orderId);
    }


}
